package org.dei.perla.sys.registry;

import java.util.Map;
import java.util.Set;

import org.dei.perla.parser.expressions.Constant;
import org.dei.perla.parser.expressions.ConstantID;
import org.dei.perla.parser.expressions.Node;
import org.dei.perla.sys.device.fpc.FunctionalityProxyComponent;

public interface RegistryInterface {

	/**
	 * Registra una FPC all'interno del registry.
	 * @param id attributo ConstantID che identifica univocamente l'FPC.
	 * La registrazione non viene eseguita se il registry contiene gia' un
	 * FPC con stesso id
	 * @param values mappa contenente gli attributi esportati dall'FPC
	 * (nome, valore)
	 * @param fpc oggetto FPC da registrare. Se vale null la registrazione non
	 * avverra'
	 */
	public void registerFpc(ConstantID id, Map<String, Constant> values, FunctionalityProxyComponent fpc);
	
	/**
	 * Registra una FPC all'interno del registry. L'id associato alla FPC
	 * verra' generato automaticamente dal sistema.
	 * @param values mappa contenente gli attributi esportati dall'FPC
	 * (nome, valore)
	 * @param fpc oggetto FPC da registrare. Se vale null la registrazione non
	 * avverra'
	 * @return id che il sistema ha automaticamente associato all'FPC
	 */
	public ConstantID registerFpc(Map<String, Constant> values, FunctionalityProxyComponent fpc);
	
	/**
	 * Deregistra dal sistema l'FPC corrispondente all'id passato come parameto
	 * @param id id corrispondente all'FPC da deregistrare. Se non e' contenuto
	 * nel sistema l'invocazione di questo metodo non produrra' alcun effetto
	 */
	public void unregisterFpc(ConstantID id);
	
	/**
	 * Aggiorna i valori degli attributi di una data FPC.
	 * @param id id dell'FPC di cui bisogna aggiornare gli attributi. Nel caso
	 * il registry non contenga alcuna FPC con l'id passato come parametro
	 * questo metodo non eseguira' alcuna modifica
	 * @param values mappa contenente gli attributi esportati dall'FPC
	 * (nome, valore). E' possibile omettere degli attributi se questi non
	 * hanno subito alcuna variazione rispetto al loro precedente valore
	 * (es. attributi statici). Ogni attributo contenuto nella struttura
	 * values non passato come parametro durante la registrazione dell'FPC
	 * sara' ignorato.
	 */
	public void updateFpc(ConstantID id, Map<String, Constant> values);
	
	/**
	 * Recupera tutte le FPC che hanno gli attributi specificati come
	 * parametro.
	 * @param attributeNames Set contenente i nomi degli attributi su cui
	 * eseguire la ricerca
	 * @param intersection se true viene calcolata l'intersezione delle FPC
	 * corrispondenti agli attributi passati come paramtetro, se false l'unione
	 * @return Set contenente le FPC trovate.
	 */
	public Set<FunctionalityProxyComponent> FpcByAttributeName(Set<String> attributeNames, boolean intersection);
	
	/**
	 * Metodo per l'interrogazione del registry
	 * @param executeIf espressione rappresentante le condizioni che devono
	 * essere soddisfatte dai nodi per essere parte della query
	 * @return Insieme di FPC che soddisfano l'espressione ExecueIf
	 */
	public Set<FunctionalityProxyComponent> query(Node executeIf);
}
